﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Xant.FlowEngine.Interface
{
    /// <summary>
    /// 组织机构类
    /// </summary>
    public interface IOrganization
    {
        /// <summary>
        /// 为了提供更好的兼容性，在接口中将主键声明为object类型，实际实现可以采用int、guid、string等类型
        /// </summary>
        object Id { get; }

        //string No { get; }

        /// <summary>
        /// 唯一代表该组织机构节点的编码，一经分配应保持永久不变
        /// </summary>
        string Code { get; }

        string Name { get; }

        /// <summary>
        /// 向最终用户显示的友好名称
        /// <remarks>如果是公司则直接显示{公司名称}，如果是部门则显示{所属公司名称.部门名称}，如果是虚拟组织则显示{上级公司名称.虚拟组织名称}</remarks>
        /// </summary>
        string FriendlyName { get; }

        //string CodeEx { get; }

        OrganizType Type { get; }

        string CustomTag { get; }

        /// <summary>
        /// 直接下级机构
        /// </summary>
        IEnumerable<IOrganization> Subordinations { get; }

        /// <summary>
        /// 直接上级机构
        /// </summary>
        IOrganization Superior { get; }

        /// <summary>
        /// 所属公司
        /// <remarks>如果该组织机构类型为公司，则返回自己，否则返回最靠近的上级公司</remarks>
        /// </summary>
        IOrganization Corporation { get; }

        /// <summary>
        /// 职员集合
        /// </summary>
        IEnumerable<IStaffMember> StaffMembers { get; }
    }

    public enum OrganizType
    {
        /// <summary>
        /// 公司
        /// </summary>
        Corporation,

        /// <summary>
        /// 部门
        /// </summary>
        Department,

        /// <summary>
        /// 虚拟的(例如片区公司)
        /// </summary>
        Fictitious,
    }

}
